package QueueP;

import QueueP.LoopQueue;
import QueueP.Queue;

public class ReLoopQueue<E> implements Queue<E> {
    private E[] data;
    private int front,tail;//队列头和尾


    public ReLoopQueue(int capacity){
        data=(E[])new Object[capacity+1];
        front=0;
        tail=0;

    }

    public ReLoopQueue(){
        this(10);
    }

    public int getCapacity(){
        return data.length-1;
    }

    @Override
    public int getSize() {

        return tail-1;
    }

    @Override
    public boolean isEmpty() {

        return front==tail;
    }

    @Override
    public void enqueue(E e) {
        if((tail+1)%data.length==front){
            resize(getCapacity()*2);
        }
        data[tail]=e;
        tail=(tail+1)%data.length;

    }

    @Override
    public E dequeue() {
        if(isEmpty()){
            throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
        }
        E ret=data[front];
        data[front]=null;
        front=(front+1)%data.length;

        return ret;
    }

    @Override
    public E getFront() {
        if(isEmpty()){
            throw new IllegalArgumentException("QueueP.Queue is empty.");
        }
        return data[front];
    }

    private void resize(int newCapacity){
        E[] newData=(E[])new Object[newCapacity+1];

        data=newData;
        front=0;

    }

    @Override
    public String toString(){
        StringBuffer res = new StringBuffer();
        res.append(String.format("QueueP.Queue: size =%d ,capacity =%d\n",getCapacity()));
        res.append("front [");
        for (int i=front;i!=tail;i=(i+1)%data.length){
            res.append(data[i]);
            if ((i+1)%data.length!=tail){
                res.append(",");
            }

        }
        res.append("] tail");
        return res.toString();

    }

    public static void main(String[] args) {
        LoopQueue<Integer> queue = new LoopQueue<>(5);
        for (int i=0;i<10;i++){
            queue.enqueue(i);
            System.out.println("queue："+queue);
            System.out.println( "getSize()："+queue.getSize());
            System.out.println("getCapacity():"+queue.getCapacity());
        }


    }
}
